package com.wang.tool.monitor.aop;

import com.wang.tool.monitor.InvokeTemplate;
import com.wang.tool.monitor.LinkLogUtil;
import com.wang.tool.monitor.MonitorConfigCenter;
import com.wang.tool.monitor.core.LinkHolder;
import com.wang.tool.monitor.core.LinkTransmitter;
import com.wang.tool.monitor.core.MonitorApi;
import com.wang.tool.monitor.core.SimpleLinkTransmitter;
import com.wang.tool.monitor.log.LogApi;
import com.wang.tool.monitor.log.SimpleLogApi;
import com.wang.tool.monitor.callback.GlobalMonitorCallback;
import com.wang.tool.monitor.callback.MonitorCallback;
import com.wang.tool.monitor.translator.ErrorTranslator;
import com.wang.tool.monitor.translator.GlobalErrorTranslator;
import com.wang.tool.monitor.translator.SimpleErrorTranslator;
import com.wang.tool.monitor.weaver.MonitorWeaver;
import com.wang.tool.monitor.weaver.TypeWeaver;
import com.wang.tool.monitor.weaver.TypeWeaverFactory;
import com.wang.tool.monitor.writer.GlobalMonitorWriter;
import com.wang.tool.monitor.writer.MonitorWriter;
import com.wang.tool.monitor.writer.SimpleMonitorWriter;
import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 开启监控切面
 * 1.全局异常翻译器
 * 2.监控输出(日志)
 * 3.细粒度日志自定义编织
 * 为了解决异常抓取问题,并没有纳入进切面中,但是提供了模板函数
 * 支持异步模式
 * 支持后补模式
 *
 * @Author wangshaopeng
 * @Date 2022/5/10
 * @see MonitorApi
 * @see InvokeTemplate
 * <p>
 * <p>
 * 最佳实践
 * 1.对于直接调用下游接口的集成层场景,直接在方法上添加@Monitor进行监控,内部的异常直接抛出
 * 2.对于向外暴露的接口,一种方式是直接使用InvokeTemplate开启监控及处理异常,保证不向外抛出异常
 * @see InvokeTemplate#monitor
 * @see MonitorAdvice#monitorAround
 * @see MonitorAdvice
 * @see Monitor
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import({MonitorConfiguration.class, MonitorRegister.class, SpringMonitorConfigSetter.class})
public @interface EnableMonitor {

    /**
     * 切面排序
     * 值越大执行越晚,靠近原始实现
     * 同优先级,后解析的更靠近原始实现
     */
    int order() default Integer.MAX_VALUE - 10;

    /**
     * log输出实现
     *
     * @see LogApi
     * @see LinkLogUtil
     * @see MonitorConfigCenter#setLogApi
     */
    Class<? extends LogApi> logApi() default SimpleLogApi.class;

    /**
     * 全局异常翻译器
     *
     * @see ErrorTranslator
     * @see GlobalErrorTranslator
     * @see SimpleErrorTranslator
     * @see MonitorAdvice#monitorAround
     * @see MonitorConfigCenter#setTranslator
     */
    Class<? extends ErrorTranslator> errorTranslator() default SimpleErrorTranslator.class;


    /**
     * 全局监控输出类
     *
     * @see MonitorWriter
     * @see MonitorWeaver
     * @see GlobalMonitorWriter
     * @see SimpleMonitorWriter
     * @see MonitorAdvice#monitorAround
     * @see MonitorConfigCenter#setMonitorWriter
     */
    Class<? extends MonitorWriter> monitorWriter() default SimpleMonitorWriter.class;

    /**
     * 类型编织扩展
     *
     * @return
     * @see TypeWeaverFactory
     * @see MonitorConfigCenter#installTypeWeaver
     */
    Class<? extends TypeWeaver>[] typeWeavers() default {};


    /**
     * 链路多线程传送器
     *
     * @return
     * @see LinkHolder
     * @see MonitorConfigCenter#setLinkTransmitter
     */
    Class<? extends LinkTransmitter> transmitter() default SimpleLinkTransmitter.class;


    /**
     * 全局回调
     *
     * @return
     * @see GlobalMonitorCallback
     * @see MonitorConfigCenter#setMonitorCallback
     */
    Class<? extends MonitorCallback> callback() default MonitorCallback.class;

}
